<?php
class lib_milkphp_coll implements ArrayAccess, Iterator {
	
	/**
	 * 集合对象的类型
	 *
	 * @var string
	 * @access private
	 */
	protected $_type;
	
	/**
	 * 保存对象的数组
	 *
	 * @var array
	 * @access private
	 */
	protected $_data = array ();
	
	/**
	 * 指示迭代对象是否有效
	 *
	 * @var boolean
	 * @access private
	 */
	protected $_is_valid = false;
	
	/*
	 * 实现数组迭代
	 * 实现 Iterator 接口
	 */
	
	/**
	 * 重置遍历索引，实现 Iterator 接口
	 */
	function rewind() {
		reset($this->_data);
	}
	
	/**
	 * 返回当前位置的对象，实现 Iterator 接口
	 *
	 * @return mixed
	 */
	function current() {
		return current($this->_data);
	}
	
	/**
	 * 返回遍历时的当前索引，实现 Iterator 接口
	 *
	 * @return mixed
	 */
	function key() {
		return key($this->_data);
	}
	
	function next() {
		return next ( $this->_data);
	}
	
	/**
	 * 遍历下一个对象，实现 Iterator 接口
	 */
	function valid() {
		$var = $this->current () !== FALSE;
		return $var;
	}

    /**
     * 返回对象总数，实现 Countable 接口
     *
     * @return int
     */
    function count()
    {
        return count($this->_data);
    }
    
	/**
     * 确定集合是否是空的
     *
     * @return boolean
     */
    function isEmpty()
    {
        return empty($this->_data);
    }
	/**
	 * 数组操作
	 */
	/**
	 * @code php
	 * echo isset($coll[1]);
	 * @endcode
	 * @param mixed $offset
	 */
	public function offsetExists($offset) {
		return isset($this->_data[$offset]);
	}
	
	/**
	 * 
	 * @code php
	 * $item = $coll[1];
	 * @endcode
	 * @param mixed $offset
	 */
	public function offsetGet($offset) {
		if (isset($this->_data[$offset])){
            return $this->_data[$offset];
        }
	}
	
	/**
	 * 
	 * @code php
	 * $coll[1] = $item;
	 * @endcode
	 * 
	 * @param mixed $offset
	 * @param mixed $value
	 */
	public function offsetSet($offset, $value) {
		if (is_null($offset))
        {
            $offset = count($this->_data);
        }
        while (isset($this->_data[$offset])) $offset++;
        $this->_data[$offset] = $value;
	}
	
	/**
	 * 
	 * @code php
	 * unset($coll[1]);
	 * @endcode 
	 * @param mixed $offset
	 */
	public function offsetUnset($offset) {
		unset ( $this->_data [$offset] );
	}
	
	function __call($method, $args){
        $return = array();
        foreach ($this->_data as $object){
        	try{
	            $return[] = @call_user_func_array(array($object, $method), $args);
        	}catch(Exception $e){
        		milkphp()->debug('e',get_class($object).'->'.$method.'is not exists');
        	}
        }
		return $return;
	}

}